package com.xbongbong.pay.platform.wechatpay.pojo.response.h5;

import com.alibaba.fastjson.annotation.JSONField;
import com.xbongbong.pay.platform.wechatpay.pojo.response.WeChatBaseResponse;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 申请退款 返回
 * @author 魏荣杰
 * @date 2021/1/11 13:38
 * @since
 * @version
 */
@Getter
@Setter
public class WeChatH5ApplyRefundResponse extends WeChatBaseResponse {
    private static final long serialVersionUID = 4650812936565791564L;

    /**
     * SUCCESS：退款申请接收成功，结果通过退款查询接口查询
     * FAIL：提交业务失败
     * 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
     * 示例值：SUCCESS
     */
    @NotBlank
    @Size(min = 1, max = 16)
    @JSONField(name = "return_code")
    private String returnCode;
    /**
     * 返回信息，如非空，为错误原因
     * 签名失败
     * 参数格式校验错误
     * 示例值：签名失败
     */
    @Size(min = 1, max = 128)
    @JSONField(name = "return_msg")
    private String returnMsg;

    /**
     * SUCCESS/FAIL
     * 示例值：SUCCESS
     */
    @NotBlank
    @Size(min = 1, max = 16)
    @JSONField(name = "result_code")
    private String resultCode;

    /**
     * 详细参见错误列表
     * 示例值：SYSTEMERROR
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "err_code")
    private String errCode;
    /**
     * 结果信息描述
     * 示例值：系统错误
     */
    @Size(min = 1, max = 128)
    @JSONField(name = "err_code_des")
    private String errCodeDes;
    /**
     * 微信分配的应用ID
     * 示例值：wx8888888888888888
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "appid")
    private String appId;

    /**
     * 微信支付分配的商户号
     * 示例值：1900000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "mch_id")
    private String mchId;
    /**
     * 微信分配的子商户应用ID，如需在支付完成后获取sub_openid则此参数必传。
     * 注意：仅适用于服务商模式
     * 示例值：wx8888888888888888
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_appid")
    private String subAppId;
    /**
     * 微信支付分配的子商户号
     * 注意：仅适用于服务商模式
     * 示例值：1900000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_mch_id")
    private String subMchId;
    /**
     * 随机字符串，不长于32位。推荐随机数生成算法
     * 示例值：5K8264ILTKCH16CQ2502SI8ZNMTM67VS
     */
    @NotBlank
    @Size(min = 1, max = 32)
    private String nonceStr;
    /**
     * 签名，详见签名生成算法
     * 示例值：C380BEC2BFD727A4B6845133519F3AD6
     */
    @NotBlank
    @Size(min = 1, max = 64)
    private String sign;
    /**
     * 微信的订单号，优先使用
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "transaction_id")
    private String transactionId;
    /**
     * 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "out_trade_no")
    private String outTradeNo;
    /**
     * 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 1, max = 64)
    @JSONField(name = "out_refund_no")
    private String outRefundNo;
    /**
     * 微信退款单号
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "refund_id")
    private String refundId;
    /**
     * 退款总金额，单位为分，只能为整数，可部分退款。详见交易金额
     * 示例值：100
     */
    @NotNull
    @JSONField(name = "refund_fee")
    private Integer refundFee;
    /**
     * 去掉非充值代金券退款金额后的退款金额，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额
     * 示例值：100
     */
    @JSONField(name = "settlement_refund_fee")
    private Integer settlementRefundFee;
    /**
     * 订单总金额，单位为分，只能为整数，详见交易金额
     * 示例值：100
     */
    @NonNull
    @JSONField(name = "total_fee")
    private Integer totalFee;
    /**
     * 应结订单金额=订单金额-免充值代金券金额，应结订单金额<=订单金额。
     * 示例值：100
     */
    @JSONField(name = "settlement_total_fee")
    private Integer settlementTotalFee;
    /**
     * 订单金额货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
     * 示例值：CNY
     */
    @JSONField(name = "fee_type")
    private String feeType;
    /**
     * 现金支付金额，单位为分，只能为整数，详见交易金额
     * 示例值：100
     */
    @NotNull
    @JSONField(name = "cash_fee")
    private Integer cashFee;
    /**
     * 现金退款金额，单位为分，只能为整数，详见交易金额
     * 示例值：100
     */
    @JSONField(name = "cash_refund_fee")
    private Integer cashRefundFee;
    /**
     * 代金券退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠
     * 示例值：100
     */
    @JSONField(name = "coupon_refund_fee")
    private Integer couponRefundFee;
    /**
     * 退款代金券使用数量
     * 示例值：1
     */
    @JSONField(name = "coupon_refund_count")
    private Integer couponRefundCount;

    /**
     * 代金券详情， 该字段与官方接口返回不同为后续自行封装
     */
    @JSONField(name = "coupon_refunds")
    @Valid
    private List<CouponRefund> couponRefunds;

    @Setter
    @Getter
    public static class CouponRefund {

        /**
         * CASH：充值代金券
         * NO_CASH：非充值代金券
         * 订单使用代金券时有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_0
         * 示例值：CASH
         */
        @Size(min = 1, max = 8)
        private String couponType;

        /**
         * 退款代金券ID，$n为下标，从0开始编号
         * 示例值：100
         */
        @Size(min = 1, max = 20)
        private String couponRefundId;

        /**
         * 单个退款代金券支付金额，$n为下标，从0开始编号
         * 示例值：100
         */
        private Integer couponRefundFee;

        public CouponRefund(String couponType, String couponRefundId, Integer couponRefundFee) {
            this.couponType = couponType;
            this.couponRefundId = couponRefundId;
            this.couponRefundFee = couponRefundFee;
        }
    }
}
